package web

import "github.com/gin-gonic/gin"

const ResponseKey = "CRACK007_GOOSE_RESPONSE"

// 在路由定义中，使用此方法来指定某个路由对应执行的某个方法。
func Action[T any](action func(ctx *gin.Context) T) gin.HandlerFunc {
	return func(context *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				v, ok := err.(*ApiException)
				if ok {
					context.Set(ResponseKey, v)
					return
				}

				panic(err)
			}
		}()
		res := action(context)
		context.Set(ResponseKey, res)
	}
}

func GetResponse(ctx *gin.Context) any {
	if response, exists := ctx.Get(ResponseKey); exists {
		return response
	}

	return nil
}
